#!/usr/bin/python
# coding:utf-8

import pymysql
import pymysql.cursors

STORE_RESULT_MODE = 0
USE_RESULT_MODE = 1

CURSOR_MODE = 0
DICTCURSOR_MODE = 1
SSCURSOR_MODE = 2
SSDICTCURSOR_MODE = 3

FETCH_ONE = 0
FETCH_MANY = 1
FETCH_ALL = 2


class PyMysql2:
    def __init__(self):
        self.conn = None
        self.cursor = None
        pass

    def newConnection(self, host, port, user, passwd, db):
        """
        建立一个新连接，指定host、用户名、密码、默认数据库
        """
        self.conn = pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db, charset="utf8")
        if self.conn.open == False:
            raise None
        self.conn.autocommit(True)
        self.cursor = self.conn.cursor()


    def closeConnnection(self):
        #关闭前先提交
        self.conn.commit()
        self.cursor.close()
        self.conn.close()

    def query(self, sqltext, mode=STORE_RESULT_MODE):
        """
        作用：使用connection对象的query方法，并返回一个元组(影响行数(int),结果集(result))
        参数：sqltext：sql语句
             mode=STORE_RESULT_MODE（0） 表示返回store_result，mode=USESTORE_RESULT_MODE（1） 表示返回use_result
        返回：元组(影响行数(int),结果集(result)
        """
        if self.conn == None or self.conn.open == False:
            return -1
        self.cursor.execute(sqltext)
        data = self.cursor.fetchall()
        data = list(data)
        return (len(data), data)

    def execute(self, sqltext, args=None, mode=CURSOR_MODE, many=False):
        """
        作用：使用游标（cursor）的execute 执行query
        参数：sqltext： 表示sql语句
             args： sqltext的参数
             mode：以何种方式返回数据集
                CURSOR_MODE = 0 ：store_result , tuple
                DICTCURSOR_MODE = 1 ： store_result , dict
                SSCURSOR_MODE = 2 : use_result , tuple
                SSDICTCURSOR_MODE = 3 : use_result , dict
             many：是否执行多行操作（executemany）
        返回：元组（影响行数（int），游标（Cursor））
        """
        # if mode == CURSOR_MODE:
        #     curclass = pymysql.cursors.Cursor
        # elif mode == DICTCURSOR_MODE:
        #     curclass = pymysql.cursors.DictCursor
        # elif mode == SSCURSOR_MODE:
        #     curclass = pymysql.cursors.SSCursor
        # elif mode == SSDICTCURSOR_MODE:
        #     curclass = pymysql.cursors.SSDictCursor
        # else:
        #     raise Exception("mode value is wrong")

        cur = self.cursor
        line = 0
        if many == False:
            if args == None:
                line = cur.execute(sqltext)
            else:
                line = cur.execute(sqltext, args)
        else:
            if args == None:
                line = cur.executemany(sqltext)
            else:
                line = cur.executemany(sqltext, args)
        return (line, cur)

    def fetch_executeresult(self, cursor, mode=FETCH_ONE, rows=1):
        """
        作用：提取cursor获取的数据集
        参数：cursor：游标
             mode：执行提取模式
              FETCH_ONE: 提取一个； FETCH_MANY :提取rows个 ；FETCH_ALL : 提取所有
             rows：提取行数
        返回：fetch数据集
        """
        if cursor == None:
            return
        if mode == FETCH_ONE:
            return cursor.fetchone()
        elif mode == FETCH_MANY:
            return cursor.fetchmany(rows)
        elif mode == FETCH_ALL:
            return cursor.fetchall()
